package raf;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 使用RAF读写基本类型数据，以及RAF指针的操作
 */
public class RAFDemo3 {
    public static void main(String[] args) throws IOException {
        RandomAccessFile raf = new RandomAccessFile(
                "demo1.txt","rw"
        );
        long pos = raf.getFilePointer();//指针，每次操作完向后移动一字节，位置与下标相同
        System.out.println("指针位置："+pos);//指针下标：0

        //向文件中写入一个int最大值，二进制为：01111111 11111111 11111111 11111111
        int imax = Integer.MAX_VALUE;
        raf.write(imax>>>24);//每次读写只能取到低八位，右移24位，将高八位移到低八位
        raf.write(imax>>>16);
        raf.write(imax>>>8);
        raf.write(imax);
        System.out.println("指针位置："+raf.getFilePointer());//指针下标：4
        //raf.writeInt(imax); 这一步直接包括上面四步
        //RAF提供了方便写出所有基本类型数据的方法
        raf.writeLong(123L);//八个字节
        System.out.println("指针位置："+raf.getFilePointer());//指针下标：12
        raf.writeDouble(123.123);//八个字节
        System.out.println("指针位置："+raf.getFilePointer());//指针下标：20

        int b = raf.read();//读取的是指针位置的内容，但是指针指向21字节，内容为空
        System.out.println(b);//-1

        raf.seek(0);//将指针位置归0
        System.out.println("指针位置："+raf.getFilePointer());//0

        int b1 = raf.read();//读0这个位的字节
        System.out.println(b1);//127

        raf.seek(0);
        int b2 = raf.readInt();//读取指针位置int的值
        System.out.println(b2);//2147483647


        raf.seek(4);
        long l = raf.readLong();//读取指针位置long的值
        System.out.println(l);//123

        double d = raf.readDouble();
        System.out.println(d);//123.123

        //修改文件中long所在位置的值改为456
        raf.seek(4);//将指针移动到long值最开始的位置
        raf.writeLong(456L);//重新写入的long值会覆盖原有数据
        raf.seek(4);
        System.out.println(raf.readLong());//456



        System.out.println("写入完毕");
        raf.close();

    }
}
